import torch


#! // FIXMEE: 现在损坏
def apply_momentum_and_clip(grad, x_real, beta=0.1, u=0.5, ξ=0.1):
    # 动量更新（μ为动量因子）
    global prev_grad  # 持久化保存历史梯度方向
    # grad = current_perturb.grad  # 当前梯度∇L
    normalized_grad = grad / (grad.norm(p=1) + 1e-8)  # L1归一化
    new_perturb = u * prev_grad + normalized_grad

    # 更新历史梯度
    prev_grad = new_perturb.detach()

    # 应用步长β和符号函数
    delta = beta * torch.sign(new_perturb)

    # 扰动幅度约束（ξ为最大扰动范围）
    x_adv = x_real + delta
    x_adv = torch.clamp(x_adv, min=x_real - ξ, max=x_real + ξ)

    return x_adv - x_real  # 返回有效扰动
    return x_adv - x_real  # 返回有效扰动
